/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BeansGerenciaveis;

import DAO.ApoioDao;
import DAO.AutorDao;
import DAO.Conexao;
import DAO.EditoraDao;
import DAO.FormatoDao;
import DAO.IdiomaDao;
import DAO.LivroDao;
import DAO.TemaDao;
import bean.Apoio;
import bean.Autor;
import bean.Colecao;
import bean.Livro;
import bean.Tema;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
 *
 * @author fernando
 */
@ManagedBean
@SessionScoped
public class LivroBean implements Serializable {

    /**
     * Creates a new instance of LivroBean
     */
    public LivroBean() {
        this.livroDao = new LivroDao();
        this.livro = new Livro();
        this.colecao = new Colecao();
        this.autorAdicionado = new Autor();
        
    }

    public void novoLivro() {
        this.livroDao = new LivroDao();
        this.livro = new Livro();
        this.colecao = new Colecao();
        this.autorAdicionado = new Autor();
        this.carregarLivros();
    }

    public LivroDao getLivroDao() {
        return livroDao;
    }

    public void setLivroDao(LivroDao livroDao) {
        this.livroDao = livroDao;
    }

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public PreparedStatement getPs() {
        return ps;
    }

    public void setPs(PreparedStatement ps) {
        this.ps = ps;
    }

    public void setInstituicoes(DataModel<Livro> livros) {
        this.livros = livros;
    }

    public boolean isSucesso() {
        return sucesso;
    }

    public void setSucesso(boolean sucesso) {
        this.sucesso = sucesso;
    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }

    public List<Livro> getListaLivros() {
        System.out.println("LivroBean - getListaLivros - Fui executado!");
        if(listaLivros == null){
            this.carregarLivros();
        }
        return listaLivros;
    }

    public void setListaLivros(List<Livro> listaLivros) {
        this.listaLivros = listaLivros;
    }

    public void selecionar() {
        livro = livros.getRowData();
    }

    public Colecao getColecao() {
        return colecao;
    }

    public void setColecao(Colecao colecao) {
        this.colecao = colecao;
    }

    public void setLivros(DataModel<Livro> livros) {
        this.livros = livros;
    }

    public Autor getAutorAdicionado() {
        return autorAdicionado;
    }

    public void setAutorAdicionado(Autor autorAdicionado) {
        this.autorAdicionado = autorAdicionado;
    }

    public Apoio getApoioAdicionado() {
        return apoioAdicionado;
    }

    public void setApoioAdicionado(Apoio apoioAdicionado) {
        this.apoioAdicionado = apoioAdicionado;
    }

    public Tema getTemaAdicionado() {
        return temaAdicionado;
    }

    public void setTemaAdicionado(Tema temaAdicionado) {
        this.temaAdicionado = temaAdicionado;
    }

    public String cadastroLivro() {
        String resultado = "/cadastros/acaoErro";

        livroDao = new LivroDao();

        //id 1 = Sem coleção
        this.colecao.setId(1);

        sucesso = livroDao.cadastrarLivro(livro, colecao);

        if (sucesso) {
            this.novoLivro();
            this.carregarLivros();
            return "/cadastros/obras/livros/cadastro/cadastroSucesso";

        }
        return resultado;
    }
    
    public String editarLivro() {
        String resultado = "/cadastros/acaoErro";

        livroDao = new LivroDao();

        //id 1 = Sem coleção
        this.colecao.setId(1);

        sucesso = livroDao.alterarLivro(livro, colecao);
       

        if (sucesso) {
            this.novoLivro();
            this.carregarLivros();
            return "/cadastros/acaoSucesso";

        }
        return resultado;
    }
    
    public String removerLivro() {
        String resultado = "/cadastros/acaoErro";

        livroDao = new LivroDao();

        //id 1 = Sem coleção
        this.colecao.setId(1);

        sucesso = livroDao.removerLivro(livro);

        if (sucesso) {
            this.novoLivro();
            this.carregarLivros();
            return "/cadastros/acaoSucesso";

        }

        return resultado;
    }

    public void addAutor() {
        AutorDao ad = new AutorDao();
        autorAdicionado = ad.consultaAutor(autorAdicionado.getId());
        this.livro.addAutor(autorAdicionado);
        this.autorAdicionado = new Autor();
    }

    public void removerAutor() {
        boolean remover = this.livro.getAutores().remove(this.getAutores().getRowData());
    }

    public DataModel<Autor> getAutores() {
        
        return new ListDataModel<Autor>(this.livro.getAutores());

    }

    public void addApoio() {
        ApoioDao ap = new ApoioDao();
        apoioAdicionado = ap.consultarApoio(apoioAdicionado.getId());
        this.livro.addApoio(apoioAdicionado);
        this.apoioAdicionado = new Apoio();
    }

    public void removerApoio() {
        boolean remover = this.livro.getApoios().remove(this.getApoio().getRowData());
    }

    public DataModel<Apoio> getApoio() {

        return new ListDataModel<Apoio>(this.livro.getApoios());

    }

    public void addTema() {
        TemaDao td = new TemaDao();
        temaAdicionado = td.consultarTema(temaAdicionado.getId());
        this.livro.addTema(temaAdicionado);
        this.temaAdicionado = new Tema();
    }

    public void removerTema() {
        boolean remover = this.livro.getTemas().remove(this.getTemas().getRowData());
    }

    public DataModel<Tema> getTemas() {

        return new ListDataModel<Tema>(this.livro.getTemas());

    }

    public void buscarDadosObra() {
        if ((this.livro.getFormato() != null)) {
            FormatoDao fd = new FormatoDao();
            this.livro.setFormato(fd.consultarFormato(this.livro.getFormato().getId()));
        }
        if (this.livro.getIdioma() != null) {
            IdiomaDao id = new IdiomaDao();
            this.livro.setIdioma(id.consultarIdioma(this.livro.getIdioma().getId()));
        }
        if (this.livro.getEditora() != null) {
            System.out.println(this.livro.getEditora().getId());
            EditoraDao ed = new EditoraDao();
            this.livro.setEditora(ed.consultarEditora(this.livro.getEditora().getId()));
            System.out.println(this.livro.getEditora().getId());
            System.out.println(this.livro.getEditora().getNome());
        }
    }

    public DataModel<Livro> getLivros() {
        System.out.println("Livro Bean - getLivros: Fui executado!");
        if(livros == null){
            this.carregarLivros();
        }
        return livros;
    }
    
    public void carregarLivros(){
        livroDao = new LivroDao();
        listaLivros = livroDao.listarLivros();
        livros = new ListDataModel<Livro>(listaLivros);
    }
    
    
    //Método Necessário para retornar uma lista a ser mostrada no selectOneMenu da view de cadastro de autores!
    /*
     public List<Instituicao> listarInstituicoes(){
     System.out.println("Instituicoes Bean - Listar Instituições: Fui executado!");
     instDao = new InstituicaoDao();
     listaInstituicoes = instDao.listarInstituicoes();
     return listaInstituicoes;
     }
    
     public String removerInstituicao() {
     String resultado = "/cadastros/acaoErro";
     instDao = new InstituicaoDao();
     sucesso = instDao.removerInstituicao(instituicao);

     if (sucesso) {
     return "/cadastros/acaoSucesso";
     }

     return resultado;
     }
    
     public String editarInstituicao()
     {
     String resultado = "/cadastros/acaoErro";
        
     instDao = new InstituicaoDao();
     System.out.println(instituicao.getId());
     System.out.println(instituicao.getNome());
     System.out.println(instituicao.getEstado());
     System.out.println(instituicao.getMunicipio());
     sucesso = instDao.alterarInstituicao(instituicao);
        
     if(sucesso)
     {
     resultado = "/cadastros/acaoSucesso";
     }
        
     return resultado;
     }
     * */
    private Colecao colecao;
    private LivroDao livroDao;
    private Livro livro;
    private PreparedStatement ps;
    private DataModel<Livro> livros;
    private boolean sucesso = false;
    private Conexao conexao;
    private List<Livro> listaLivros;
    private Autor autorAdicionado = new Autor();
    private Apoio apoioAdicionado = new Apoio();
    private Tema temaAdicionado = new Tema();
    
   
}
